package org.dicr.util.jds.conn;

import java.util.*;

import com.borland.dx.sql.dataset.*;

/***********************************************************************************************************************
 * Элемент таблицы соединений
 * 
 * @author Igor A Tarasov me@dicr.dn.ua
 * @version 030105
 **********************************************************************************************************************/
public class ConnectionElement {
	private long id = System.currentTimeMillis() * 100 + new Random().nextInt(100);

	private String name = "Новое соединение";

	private ConnectionDescriptor desc = new ConnectionDescriptor("jdbc:borland:dsremote://server.net/datafile.jds",
	        "user", "password", false, "com.borland.datastore.jdbc.DataStoreDriver", new Properties());

	/*******************************************************************************************************************
	 * Конструктор
	 ******************************************************************************************************************/
	public ConnectionElement() {
		setID();
	}

	/*******************************************************************************************************************
	 * Конструктор
	 * 
	 * @param theName connection name
	 * @param theDesc connection descriptor
	 ******************************************************************************************************************/
	public ConnectionElement(String theName, ConnectionDescriptor theDesc) {
		this();
		setName(theName);
		setDescriptor(theDesc);
	}

	/*******************************************************************************************************************
	 * Генерирует новый id
	 * 
	 * @return new id
	 ******************************************************************************************************************/
	public long makeID() {
		return System.currentTimeMillis() * 100 + new Random().nextInt(100);
	}

	/*******************************************************************************************************************
	 * Возвращает ID
	 * 
	 * @return connectopn id
	 ******************************************************************************************************************/
	public long getID() {
		return this.id;
	}

	/*******************************************************************************************************************
	 * Устанавливает ID
	 * 
	 * @param theId connection id
	 ******************************************************************************************************************/
	protected void setID(long theId) {
		if (theId < 100) throw new IllegalArgumentException("id");
		this.id = theId;
	}

	/*******************************************************************************************************************
	 * Устанавливает ID
	 ******************************************************************************************************************/
	protected void setID() {
		setID(makeID());
	}

	/*******************************************************************************************************************
	 * Возвращает имя
	 * 
	 * @return connection name
	 ******************************************************************************************************************/
	public String getName() {
		return this.name;
	}

	/*******************************************************************************************************************
	 * Устанавливает имя
	 * 
	 * @param theName connection name
	 ******************************************************************************************************************/
	public void setName(String theName) {
		if (theName == null) throw new IllegalArgumentException("name is null");
		this.name = theName;
	}

	/*******************************************************************************************************************
	 * Возвращает описатель соединения
	 * 
	 * @return connection descriptor
	 ******************************************************************************************************************/
	public ConnectionDescriptor getDescriptor() {
		return this.desc;
	}

	/*******************************************************************************************************************
	 * Устанавливает описатель соединения
	 * 
	 * @param theDesc connection descriptor
	 ******************************************************************************************************************/
	public void setDescriptor(ConnectionDescriptor theDesc) {
		if (theDesc == null) throw new IllegalArgumentException("desc is null");
		this.desc = theDesc;
	}

	/**
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
	    final int prime = 31;
	    int result = 1;
	    result = prime * result + ((this.desc == null) ? 0 : this.desc.hashCode());
	    result = prime * result + (int) (this.id ^ (this.id >>> 32));
	    result = prime * result + ((this.name == null) ? 0 : this.name.hashCode());
	    return result;
    }

	/**
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
	    if (this == obj) return true;
	    if (obj == null) return false;
	    if (!(obj instanceof ConnectionElement)) return false;
	    ConnectionElement other = (ConnectionElement) obj;
	    if (this.desc == null) {
		    if (other.desc != null) return false;
	    } else if (!this.desc.equals(other.desc)) return false;
	    if (this.id != other.id) return false;
	    if (this.name == null) {
		    if (other.name != null) return false;
	    } else if (!this.name.equals(other.name)) return false;
	    return true;
    }

}
